/*
 * RegistroTitulo.cpp
 *
 *  Created on: 21/04/2013
 *      Author: pancho
 */

#include "RegistroTitulo.h"
#include "RegistroOffset.h"

RegistroTitulo::RegistroTitulo() {
	this->listaDeIds = new list<unsigned int>();
}

RegistroTitulo::RegistroTitulo(char *datos) {
	this->listaDeIds = new list<unsigned int>();
	unsigned short int tamanioTitulo;
	unsigned int tamanio;
	unsigned int id;
	unsigned int posicion = 0;
	memcpy((char*)&tamanioTitulo, &(datos[posicion]), sizeof(unsigned short int));
	posicion += sizeof(unsigned short int);

	char titulo[tamanioTitulo + 1];
	memcpy((char*)&titulo, &(datos[posicion]), tamanioTitulo);
	titulo[tamanioTitulo] = '\0';
	this->Titulo = titulo;
	posicion += tamanioTitulo;

	memcpy((char*)&tamanio, &(datos[posicion]), sizeof(unsigned int));
	posicion += sizeof(unsigned int);
	for(;posicion < sizeof(unsigned short int) + tamanioTitulo + sizeof(unsigned int) + tamanio;posicion += 4) {
		memcpy((char*)&id, &(datos[posicion]), sizeof(unsigned int));
		this->agregarId(id);
	}
}


//Getters
list<unsigned int> * RegistroTitulo::getId()
{
	return this->listaDeIds;
}

string RegistroTitulo::getTitulo()
{
	return this->Titulo;
}

//Setters
void RegistroTitulo::agregarId(unsigned int nuevoIdCancion)
{
	this->listaDeIds->push_back(nuevoIdCancion);
}
void RegistroTitulo::setTitulo(string nuevoTitulo)
{
	this->Titulo = nuevoTitulo;
}


int RegistroTitulo::devolverDato(HashExtensible* unHash)
{
	return (unHash->fd(this->getTitulo()));
}

bool RegistroTitulo::SosIgual(unsigned int IdCancion) {

	list<unsigned int>::iterator iteradorLista = this->getId()->begin();

	while(iteradorLista != this->getId()->end())
	{
		if ((*iteradorLista) == IdCancion)
		{
			return true;
		}
		else
		{
			iteradorLista++;
		}

	}
	return false;
}

bool RegistroTitulo::SosIgual(Registro* otroRegistro) {
	return otroRegistro->SosIgual(this);
}
bool RegistroTitulo::SosIgual(RegistroOffset* unRegistroOffset) {
return false;
}

bool RegistroTitulo::SosIgual(RegistroTitulo* unRegistroTitulo) {
	return (this->getTitulo() == unRegistroTitulo->getTitulo());
}

char* RegistroTitulo::regToChar() {
	unsigned short int tamanioTitulo = this->Titulo.size();
	unsigned int tamanio = this->listaDeIds->size() * sizeof(unsigned int);
	char* datos = new char[sizeof(unsigned short int) + tamanioTitulo + sizeof(unsigned int) + tamanio];
	unsigned int posicion = 0;
	memcpy(&(datos[posicion]), (char*)&tamanioTitulo, sizeof(unsigned short int));
	posicion += sizeof(unsigned short int);
	memcpy(&(datos[posicion]), this->Titulo.c_str(), tamanioTitulo);
	posicion += tamanioTitulo;
	memcpy(&(datos[posicion]), (char*)&tamanio, sizeof(unsigned int));
	posicion += sizeof(unsigned int);
	list<unsigned int>::iterator iteradorLista = this->listaDeIds->begin();
	while (iteradorLista != this->listaDeIds->end()) {
		memcpy(&(datos[posicion]), (char*)&(*iteradorLista), sizeof(unsigned int));
		posicion += sizeof(unsigned int);
		iteradorLista++;
	}
	return datos;
}

unsigned int RegistroTitulo::getTamanioChar() {
	unsigned int tamanio = sizeof(unsigned short int) + this->Titulo.size() +
			sizeof(unsigned int)+ this->listaDeIds->size() * sizeof(unsigned int);
	return tamanio;
}

RegistroTitulo::~RegistroTitulo() {
	this->listaDeIds->clear();
	delete this->listaDeIds;
}


